/**
 * Copyright (C), 2001-2022, www.bosssof.com.cn
 * FileName: UtilDemo
 * Author: Administrator
 * Date: 2022-10-25 09:47:02
 * Description:
 * <p>
 * History:
 * <author> Administrator
 * <time> 2022-10-25 09:47:02
 * <version> 1.0.0
 * <desc> 该文件针对(五)	常用工具类作业进行了demo开发
 */
package com.bosssoft.hr.train.j2se.util;


import org.apache.tomcat.util.http.fileupload.FileUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.function.Predicate;

/**
 * @ClassName: UtilDemo
 * @Description: 对工具类的使用通过method 1 到 method7 进行了演示，通过作业能在后续
 * 开发中充分的利用系统提供的工具类不重复发明轮子，如果组织有对其封装则调用组织封装的这点依据实际的项目要求工作
 * @Author: 史旭升
 * @Date: 2022-12-11 23:04
 **/
public class UtilDemo {
    /**
     * sort
     */
    public void method1(){
        List<Integer> list=new ArrayList<>();
        Random random=new Random(1000);
        for(int i=0;i<10;i++){
            list.add(random.nextInt(100));//生成100以内数字
        }

        Collections.sort(list);

       Iterator<Integer> iterator= list.iterator();
       while (iterator.hasNext()){
           System.out.println();
       }
    }


    /**
     * method1-mehtod4 为集合工具类作业这个和作业要求对应
     * 首先在pom中引入 apache-common 下的 collection
     * Apache CollectionUtils 该方法为 集合判空
     * IsEmpty()
     * Exist（）
     * AddAll()
     */
    public void method2(){
        List<Integer> list=new ArrayList<>();
        Random random=new Random(1000);
        for(int i=0;i<10;i++){
            list.add(random.nextInt(100));//生成100以内数字
        }
        /**
         *   isEmpty
         */
        System.out.println("测试结果"+ CollectionUtils.isEmpty(list));
        /**
         * exist 判断 我们的集合中是否包含 Preicate指定的规则的数据如果包含返回true
         */
        String[] langs = {"java", "python", "c"};
        CollectionUtils.Exists(Arrays.asList(langs), new Predicate<String>() {
            @Override
            public boolean evaluate(String s) {
                return "python".equalsIgnoreCase(s);
            }
        });
        /**
         * 将另外一个langs2的数组并入本集合中，方便数组合并用词替代for循环合并数组
         */
        String[] langs2 = {"java2", "python2", "c2"};
        CollectionUtils.addAll(Arrays.asList(langs),langs2);


    }
    /**
     * method1-mehtod4 为集合工具类作业这个和作业要求对应
     * Arrays 该方法为 asList,sort，banarrySearch
     */
    public void method3(){
        Integer[] score=new Integer[]{5,2,3,4,1};
        // 常用该方法把数组转化为列表
        List<Integer> scoreList=Arrays.asList(score);
        //数字排序 简单的支持 复杂的需要编写比较器 ,toArray 从列表转为数组
        Object[] scoreChange=scoreList.toArray();
        Arrays.sort(scoreChange);
        // 查找，使用二分查找加快速度
        Arrays.binarySearch(score,2);
        // 依次拷贝3个元素到数组
        Integer[] copyArray=Arrays.copyOf(score,3);

    }
    /**
     * method1-mehtod4 为集合工具类作业这个和作业要求对应 Apache
     * FileUtils
     * 该方法为 listFiles
     */
    public void method4(){
        /**
         *  FileUitl 封装了 文件的各种操作，包括目录操作，文件操作（文件删除，文件内容读取，文件写入等）
         *  下面例子演示了遍历某一个指定目录下的所有的文件，第2个代表类型，第3个参数代表递归遍历
         *  在项目开发中经常碰到文件操作因此有必要熟悉该工具类
         */
       Collection files= FileUtils.listFiles(new File("/"),new String[]{"*.java"},true);
    }

    /**
     * method5 字符串操作是项目中参见操作，建议使用字符串工具类操作
     * StringUtil ，该类在apache-common-lang3,
     * 该方法为 isEmpty  替代 string==null || string 内容为“”的判断
     */
    public void method5(){
        // 这个视为空
        StringUtils.isEmpty("");
        String hello=null;
        //这个视图为空
        StringUtils.isEmpty(hello);
    }

    /**
     * method6对象拷贝是项目中参见操作例如 service层参数 DTO 转mapper操作的 entity，建议使用字符串工具类操作
     *  ，BeanUtil
     * 该方法为 copyProperties  替代逐个的setXX方法
     */
    public void method6() throws InvocationTargetException, IllegalAccessException {
        User user=new User();
        user.setCode("BS0001");
        user.setName("同学1");
        /**
         * 如果对象列的太多没有使用copy则要单个赋值代码太繁琐，项目中多处用到对象拷贝
        *   注意 如果对象内部包含对象和链表数组则只是拷贝应用，需要引入手动完成拷贝
         *   对象拷贝库众多，效率上有所差别，如果对象数量比较大可以考虑其他的库，如果量不大
         *   apache BeanUtil.copy可以满足
         * */
        User userCopy=new User();
        BeanUtils.copyProperties(user,userCopy);

    }

    /**
     * method7对象拷贝是项目经常需要对用户输入的敏感数据加密例如 密码 等一些隐私数据，建议使用字符串工具类操作
     *  ，DigestUtils 替代 个人封装
     * 该方法为 copyProperties  替代逐个的setXX方法
     */
    public void method7() throws UnsupportedEncodingException {
        // MD5 加密  部分网站可以暴力破解
        String password="helloworld";
        byte[] bytePassword=password.getBytes("utf-8");
        DigestUtils.md5(bytePassword);
        // SH3 加密 安全性更好不可逆
        DigestUtils.sha3_256(bytePassword);


    }
}
